package com.mini;

import java.beans.PropertyDescriptor;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Arrays;

public class MiniGenerousBeanProcessor extends MiniBeanProcessor {

    // 增强父类方法，允许实体类映射到数据库的字段含有下划线
    protected int[] mapColumnsToProperties(final ResultSetMetaData rsmd,
                                           final PropertyDescriptor[] props) throws SQLException {
        // 获取查询结果的总列数
        final int cols = rsmd.getColumnCount();
        // 创建容器，记录结果列与导出属性的位置映射关系
        int[] columnToProperty = new int[cols +1];
        // 给映射关系赋值初始值（默认情况下是未找对应的属性，即对应'-1'）
        Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);

        for (int i=1; i <= cols; i++) {
            // 获取列的别名，没有就获取列名
            String columnName = rsmd.getColumnLabel(i);
            if (columnName == null || 0 == columnName.length()) {
                columnName = rsmd.getColumnName(i);
            }

            // 将列名中"_"去除，如：“pass_word” 处理成 “password”
            String generousColumnName = columnName.replace("_", "");

            for (int p=1; p<props.length; p++) {
                // 获取导出属性的属性名
                final String propName = props[p].getName();
                // 如果取出的属性名和去掉分隔线的列名或者原始的列名相同，就将映射关系记录起来
                if (propName.equalsIgnoreCase(columnName) || propName.equalsIgnoreCase(generousColumnName)) {
                    columnToProperty[i] = p;
                    break;
                }
            }
        }

        return columnToProperty;
    }
}
